package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.CreateWorkingAreaDTO;
import me.yushuai.wukong.base.api.dto.PagingSearchWorkingArea;
import me.yushuai.wukong.base.api.dto.UpdateWorkingAreaDTO;
import me.yushuai.wukong.base.api.dto.WorkingAreaDTO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.error.WuKongWebException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 工作区管理客户端
 *
 * @author zhoushuai@189.cn
 * @since 2022-09-07
 */
@Api("工作区API")
@FeignClient("${spring.application.name}")
public interface WorkingAreaApi {

    /**
     * 新建一条工作区记录
     *
     * @param dto 新建工作区信息
     * @return 返回工作区的编号
     * @throws WuKongException 当工作区编码已经存在时抛出异常
     */
    @ApiOperation("新建工作区")
    @PostMapping("/working-area")
    Long createWorkingArea(@Validated @RequestBody CreateWorkingAreaDTO dto) throws WuKongException;

    /**
     * 修改工作区信息
     *
     * @param id  工作区编号
     * @param dto 工作区信息
     * @return 返回被修改的工作区编号
     * @throws WuKongException 当工作区编号不存在时抛出异常
     */
    @ApiOperation("修改工作区")
    @PutMapping("/working-area/{id}")
    Long editWorkingArea(@PathVariable("id") Long id, @Validated @RequestBody UpdateWorkingAreaDTO dto) throws WuKongException;

    /**
     * 删除一条工作区信息
     *
     * @param id 工作区编号
     * @return 返回工作区的编号
     * @throws WuKongException 当工作区不存在时抛出异常
     */
    @ApiOperation("删除工作区")
    @DeleteMapping("/working-area/{id}")
    Long deleteWorkingArea(@PathVariable("id") Long id) throws WuKongException;

    /**
     * 获取工作区详细信息
     *
     * @param workingAreaId 工作区编号
     * @return 返回工作区详细信息
     * @throws WuKongException 当工作区信息不存在时抛出异常
     */
    @ApiOperation("工作区详细信息")
    @GetMapping(value = "/working-area/{workingAreaId}", params = "action=get-by-id")
    WorkingAreaDTO getById(@PathVariable("workingAreaId") Long workingAreaId) throws WuKongException;

    /**
     * 通过工作区编码查询工作区的详细信息
     *
     * @param bizId 工作业务Id
     * @return 返回工作区的详细信息
     * @throws WuKongWebException 当工作区编码不存在时抛出异常
     */
    @ApiOperation("工作区详细信息")
    @GetMapping("/working-area/{bizId}")
    WorkingAreaDTO getByBizId(@PathVariable("bizId") String bizId) throws WuKongWebException;

    /**
     * 分页条件检索工作区信息
     *
     * @param dto 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索工作区")
    @PostMapping("/working-areas")
    PageDTO<WorkingAreaDTO> pagingSearchWorkingArea(@Validated @RequestBody PagingSearchWorkingArea dto);
}
